# coding:utf-8


def extract_item_id(request):
    pass


def is_dynamic(request):
    pass


def can_cache(conn, request):
    # 尝试从页面里面取出商品ID。
    item_id = extract_item_id(request)
    # 检查这个页面能否被缓存以及这个页面是否为商品页面。
    if not item_id or is_dynamic(request):
        return False
    # 取得商品的浏览次数排名
    rank = conn.zrank('viewed:', item_id)
    # 根据商品的浏览次数排名来判断是否需要缓存这个页面。
    return rank is not None and rank < 10000


def hash_request(request):
    pass


def cache_request(conn, request, callback):
    # 对于不能被缓存的请求，直接调用回调函数
    if not can_cache(conn, request):
        return callable(request)

    # 将请求转换成一个简单的字符串键，方便之后进行查找。
    page_key = 'cache:' + hash_request(request)
    # 尝试查找被缓存的页面。
    content = conn.get(page_key)

    if not content:
        # 如果页面还没有被缓存，那么生成页面。
        content = callable(request)
        # 将新生成的页面放到缓存里面
        conn.setex(page_key, content, 300)

    # 返回页面
    return content






